#!/bin/bash

# 教务信息管理系统部署脚本
# 用于生产环境部署和更新

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否为root用户
check_root() {
    if [[ $EUID -eq 0 ]]; then
        log_error "请不要使用root用户运行此脚本"
        exit 1
    fi
}

# 检查Python版本
check_python() {
    if ! command -v python3 &> /dev/null; then
        log_error "Python3 未安装"
        exit 1
    fi
    
    python_version=$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))')
    if [[ $(echo "$python_version < 3.8" | bc -l) -eq 1 ]]; then
        log_error "Python版本需要3.8或更高，当前版本: $python_version"
        exit 1
    fi
    
    log_info "Python版本检查通过: $python_version"
}

# 检查依赖
check_dependencies() {
    log_info "检查系统依赖..."
    
    # 检查必要的命令
    commands=("git" "pip3" "virtualenv")
    for cmd in "${commands[@]}"; do
        if ! command -v $cmd &> /dev/null; then
            log_error "$cmd 未安装"
            exit 1
        fi
    done
    
    log_info "系统依赖检查通过"
}

# 创建虚拟环境
setup_virtualenv() {
    log_info "设置Python虚拟环境..."
    
    if [ ! -d "venv" ]; then
        python3 -m venv venv
        log_info "虚拟环境创建成功"
    else
        log_info "虚拟环境已存在"
    fi
    
    source venv/bin/activate
    pip install --upgrade pip
    log_info "虚拟环境激活成功"
}

# 安装依赖
install_dependencies() {
    log_info "安装Python依赖..."
    
    if [ -f "requirements.txt" ]; then
        pip install -r requirements.txt
        log_info "依赖安装完成"
    else
        log_error "requirements.txt 文件不存在"
        exit 1
    fi
}

# 检查环境配置
check_env_config() {
    log_info "检查环境配置..."
    
    if [ ! -f ".env" ]; then
        if [ -f ".env.example" ]; then
            cp .env.example .env
            log_warn "已复制 .env.example 到 .env，请编辑配置文件"
            log_warn "请设置以下必要的环境变量："
            log_warn "- SECRET_KEY"
            log_warn "- DATABASE_URL"
            log_warn "- ALLOWED_HOSTS"
            read -p "配置完成后按回车继续..."
        else
            log_error ".env 和 .env.example 文件都不存在"
            exit 1
        fi
    fi
    
    log_info "环境配置检查完成"
}

# 数据库迁移
migrate_database() {
    log_info "执行数据库迁移..."
    
    python manage.py makemigrations
    python manage.py migrate
    
    log_info "数据库迁移完成"
}

# 收集静态文件
collect_static() {
    log_info "收集静态文件..."
    
    python manage.py collectstatic --noinput
    
    log_info "静态文件收集完成"
}

# 创建超级用户
create_superuser() {
    log_info "检查超级用户..."
    
    if python manage.py shell -c "from django.contrib.auth.models import User; print(User.objects.filter(is_superuser=True).exists())" | grep -q "False"; then
        log_warn "未发现超级用户，请创建一个："
        python manage.py createsuperuser
    else
        log_info "超级用户已存在"
    fi
}

# 运行测试
run_tests() {
    log_info "运行测试..."
    
    python manage.py test
    
    if [ $? -eq 0 ]; then
        log_info "所有测试通过"
    else
        log_error "测试失败"
        exit 1
    fi
}

# 启动服务
start_service() {
    log_info "启动服务..."
    
    if [ "$1" = "production" ]; then
        log_info "使用Gunicorn启动生产服务器..."
        gunicorn --config gunicorn_config.py educational_system.wsgi:application
    else
        log_info "启动开发服务器..."
        python manage.py runserver 0.0.0.0:8000
    fi
}

# Docker部署
deploy_docker() {
    log_info "使用Docker部署..."
    
    if ! command -v docker &> /dev/null; then
        log_error "Docker 未安装"
        exit 1
    fi
    
    if ! command -v docker-compose &> /dev/null; then
        log_error "Docker Compose 未安装"
        exit 1
    fi
    
    # 构建并启动服务
    docker-compose build
    docker-compose up -d
    
    # 等待服务启动
    log_info "等待服务启动..."
    sleep 10
    
    # 执行数据库迁移
    docker-compose exec web python manage.py migrate
    
    # 收集静态文件
    docker-compose exec web python manage.py collectstatic --noinput
    
    log_info "Docker部署完成"
    log_info "访问地址: http://localhost"
}

# 备份数据库
backup_database() {
    log_info "备份数据库..."
    
    backup_dir="backups"
    mkdir -p $backup_dir
    
    timestamp=$(date +%Y%m%d_%H%M%S)
    backup_file="$backup_dir/db_backup_$timestamp.json"
    
    python manage.py dumpdata > $backup_file
    
    log_info "数据库备份完成: $backup_file"
}

# 显示帮助信息
show_help() {
    echo "教务信息管理系统部署脚本"
    echo ""
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  install     安装和配置系统"
    echo "  update      更新系统"
    echo "  start       启动开发服务器"
    echo "  production  启动生产服务器"
    echo "  docker      使用Docker部署"
    echo "  test        运行测试"
    echo "  backup      备份数据库"
    echo "  help        显示此帮助信息"
    echo ""
}

# 主函数
main() {
    case "$1" in
        "install")
            log_info "开始安装教务信息管理系统..."
            check_root
            check_python
            check_dependencies
            setup_virtualenv
            install_dependencies
            check_env_config
            migrate_database
            collect_static
            create_superuser
            log_info "安装完成！"
            log_info "运行 '$0 start' 启动开发服务器"
            ;;
        "update")
            log_info "更新系统..."
            source venv/bin/activate
            backup_database
            install_dependencies
            migrate_database
            collect_static
            log_info "更新完成！"
            ;;
        "start")
            source venv/bin/activate
            start_service "development"
            ;;
        "production")
            source venv/bin/activate
            start_service "production"
            ;;
        "docker")
            deploy_docker
            ;;
        "test")
            source venv/bin/activate
            run_tests
            ;;
        "backup")
            source venv/bin/activate
            backup_database
            ;;
        "help"|"--help"|"-h")
            show_help
            ;;
        *)
            log_error "未知选项: $1"
            show_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"